#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

using namespace std;
// int cnt = 0;

void Print(sigset_t &pending)
{
    for (int sigal = 31; sigal > 0; sigal--)
    {
        if (sigismember(&pending, sigal) == 0)
            cout << "0";
        else
            cout << "1";
    }
    cout<<endl;
}
void handler(int sig)
{
    cout << "屏蔽了：" << sig << " 号信号" << endl;
    sigset_t pending;
    sigemptyset(&pending);
    while (1)
    {
        sigpending(&pending);
        Print(pending);
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    //也想屏蔽其他信号，就加入信号屏蔽字
    sigaddset(&act.sa_mask,3);
    sigaddset(&act.sa_mask,4);
    sigaddset(&act.sa_mask,5);
    // 屏蔽2号信号，并且阻塞到结束为止
    sigaction(2, &act, &oact);


    while(1) sleep(1);

    return 0;
}

// void Printpending(sigset_t &pending)
// {
//     cout << "pending bitmap: ";
//     for (int sig = 40; sig > 0; sig--)
//     {
//         int n = sigismember(&pending, sig);
//         if (n == 1)
//         {
//             cout << "1";
//         }
//         else
//         {
//             cout << "0";
//         }
//     }
//     cout << endl;
// }

// void handler(int signo)
// {
//     sigset_t pending;
//     sigemptyset(&pending);
//     int n = sigpending(&pending); // 我正在处理2号信号哦！！
//     assert(n == 0);

//     // 3. 打印pending位图中的收到的信号
//     std::cout << "递达中...: ";
//     Printpending(pending); // 0: 递达之前，pending 2号已经被清0. 1: pending 2号被清0一定是递达之后
//     std::cout << signo << " 号信号被递达处理..." << std::endl;
// }

// int main()
// {

//     // 对2号信号进行自定义捕捉 --- 不让进程因为2号信号而终止
//     //signal(2, handler);

//     sigset_t block, oblock;
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     //for(int sig = 0;sig<31;sig++)
//     sigaddset(&block, 2); // 此时，还没有设置进当前的block位图中
//     sigaddset(&block, 40);
//     // 屏蔽2号信号，对内核进行操作了
//     int n = sigprocmask(SIG_SETMASK, &block, &oblock);
//     assert(n == 0);
//     cout<<"block 2 sig success"<<endl;
//     cout<<"block 40 sig success"<<endl;
//     cout<<"my pid: "<<getpid()<<endl;

//     int count = 0;
//     while (1)
//     {
//         // 获取pending位图
//         sigset_t pending;
//         sigemptyset(&pending);
//         n = sigpending(&pending);
//         assert(n == 0);

//         // 看看pending位图
//         Printpending(pending);
//         sleep(1);
//         //count++;

//         //解除对二号信号的屏蔽  2好信号 1->0
//         // if(count == 10)
//         // {
//         //     cout<<"解除对二号信号的屏蔽"<<endl;
//         //     n = sigprocmask(SIG_UNBLOCK,&block,&oblock);
//         //     assert(n==0);
//         // }
//         // sleep(1);

//     }
// }

// int main()
// {
//     // int a = 10;
//     // a = a/0;
//     int* p = nullptr;
//     *p = 1234;

//     while(1)
//     {
//         cout<<cnt++<<endl;
//     }
// }

// void handler(int sig)
// {
//     cout<<"is time to eixt"<<endl;
//     int n = alarm(2);
//     cout<<"the last time is: "<<n<<endl;
// }

// int main()
// {
//     signal(SIGALRM,handler);
//     int count = 0;
//     alarm(5);
//     while (1)
//     {
//         cout<< count++ <<endl;
//         sleep(1);
//         if(count == 10)
//         {
//             int n = alarm(0);
//         }
//     }
//     return 0;
// }

// int main()
// {

//     int count = 0;
//     while (1)
//     {
//         cout<< count++ <<endl;
//         if(count == 5)
//         {
//             abort();
//         }
//         sleep(1);

//     }
//     return 0;
// }

// int main()
// {

//     int count = 0;
//     while (1)
//     {
//         cout<< count++ <<endl;
//         if(count == 10)
//         {
//             break;
//         }
//         sleep(1);
//     }
//     int n = raise(SIGSTOP);//SIGSTOP:19
//     if(n < 0)
//     {
//         cout<<"kill errno: "<<errno<<"stringerror: "<<strerror(errno)<<endl;
//     }

// }

// //mykill -9 pid
// int main(int argc,char* argv[])
// {
//     if(argc != 3)
//     {
//         cout<<"you must input 3 parameter "<<endl;
//         exit(0);
//     }
//     int signal = stoi(argv[1]+1);
//     int pid = stoi(argv[2]);
//     int n = kill(pid,signal);
//     if(n < 0)
//     {
//         cout<<"kill errno: "<<errno<<"stringerror: "<<strerror(errno)<<endl;
//     }
//     return 0;
// }

// void sigcb(int sig)
// {
//     cout << "get a sig :" << sig << endl;
// }

// int main()
// {
//     //自定义处理
//     //signal(SIGINT, sigcb);

//     //忽略
//     //signal(SIGINT, SIG_IGN);

//     while (1)
//     {
//         cout << "my pid is:" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }